
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>MybatisPlus的原理什么 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>MybatisPlus的原理什么 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">MyBatis Plus 进行数据库操作的核心原理是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">MyBatis Plus 的底层原理基于 MyBatis 的 SQL 映射和执行机制。它通过动态生成 SQL 语句、进行参数处理、执行 SQL 和处理结果这几个步骤，来实现与数据库的交互。同时，它还提供了缓存管理等功能来优化性能。</div>
          </div>
          <div class="card-source">来源: 文档开篇及总结段落</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">MyBatis Plus 在执行数据库操作时，主要包含哪五个关键步骤？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">MyBatis Plus 的数据库操作主要包含五个步骤：1. SQL 语句生成；2. 参数处理；3. SQL 语句执行；4. 结果处理；5. 缓存管理。</div>
          </div>
          <div class="card-source">来源: 文档开篇的有序列表部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">MyBatis Plus 提供了哪两种类型的缓存？它们的作用范围有何不同？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">MyBatis Plus 提供了一级缓存和二级缓存。一级缓存是针对同一个 SqlSession 的缓存，作用范围是会话级别。而二级缓存是全局的，可以跨 SqlSession 共享缓存数据。</div>
          </div>
          <div class="card-source">来源: 文档中「缓存管理」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">MyBatis Plus 中的 Mapper 代理对象是在应用启动时就创建好的吗？如果不是，它通常在什么时候被创建？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">不是在应用启动时创建。MyBatis Plus 的代理对象是在调用时动态生成的。通常有三种情况会创建代理：1. 当调用 Mapper 接口的方法时；2. 当进入一个事务边界时（例如通过 @Transactional 注解）；3. 当某个 Mapper 接口的方法在应用中首次被调用时。</div>
          </div>
          <div class="card-source">来源: 文档中「代理」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">在使用 `userMapper.save(user)` 时，MyBatis Plus 是如何知道 `user` 对象应该插入到哪个数据库表中的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">MyBatis Plus 通过实体类上的 `@TableName` 注解来确定对象与数据库表的映射关系。例如，它通过 User 实体类上的 `@TableName` 注解得知其对应的是 `t_user` 表。</div>
          </div>
          <div class="card-source">来源: 文档中「举例」部分的第一点</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">MyBatis Plus 如何处理 Java 对象属性名（如 `isAdmin`）与数据库字段名（如 `is_admin`）之间的映射？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">MyBatis Plus 会自动进行转换，将数据库中常见的下划线命名法（snake_case）字段（如 `is_admin`）自动转换为 Java 中推荐的驼峰命名法（camelCase）属性（如 `isAdmin`）。</div>
          </div>
          <div class="card-source">来源: 文档中「举例」部分的第二点</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">MyBatis Plus 是如何将数据库查询结果返回给调用方的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">对于查询操作，MyBatis Plus 会将数据库返回的结果集映射到对应的实体类中，封装成 Java 对象返回给调用方，以便开发者直接使用。</div>
          </div>
          <div class="card-source">来源: 文档中「结果处理」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">MyBatis Plus 最终是如何执行生成的 SQL 语句的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">MyBatis Plus 会通过 MyBatis 的核心组件来执行生成的 SQL 语句。MyBatis 负责管理 SQL 与 Java 方法的映射、数据源连接以及事务管理。</div>
          </div>
          <div class="card-source">来源: 文档中「SQL 语句执行」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">为了提升性能，MyBatis Plus 如何处理首次调用后创建的代理对象？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">当某个 Mapper 接口的方法首次被调用并动态生成代理对象后，MyBatis Plus 会将该代理对象缓存起来，以备后续使用，这样可以避免频繁创建代理对象，从而提高性能。</div>
          </div>
          <div class="card-source">来源: 文档中「代理」部分的第三点「第一次调用」</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
